package com.landinfo.web.rest.util;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtils;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.*;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot3D;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import java.awt.*;
import java.io.*;
import java.text.SimpleDateFormat;


// 参考资料 https://www.cnblogs.com/zewentdcq/p/3458858.html

public class WordChartUtil {



    /**
     * 柱状图
     * @param outPicture
     * @param chartDate
     * @param title
     * @param xFieldTitle
     * @param yFieldTitle
     */
    public static void barChart3D(File outPicture,DefaultCategoryDataset chartDate,String title,String xFieldTitle,String yFieldTitle){
        try {
            // 从数据库中获得数据集
            DefaultCategoryDataset data = chartDate;
            // 使用ChartFactory创建3D柱状图，不想使用3D，直接使用createBarChart
            // JFreeChart chart = ChartFactory.createBarChart3D(

            JFreeChart chart = ChartFactory.createBarChart(
                title, // 图表标题
                xFieldTitle, // 目录轴的显示标签
                yFieldTitle, // 数值轴的显示标签
                data, // 数据集
                PlotOrientation.VERTICAL, // 图表方向，此处为垂直方向
                // PlotOrientation.HORIZONTAL, //图表方向，此处为水平方向
                true, // 是否显示图例
                true, // 是否生成工具
                false // 是否生成URL链接
            );
            // 设置整个图片的背景色
            chart.setBackgroundPaint(Color.PINK);
            // 设置图片有边框
            chart.setBorderVisible(true);
            Font kfont = new Font("宋体", Font.PLAIN, 12);    // 底部
            Font titleFont = new Font("宋体", Font.BOLD, 25); // 图片标题
            // 图片标题
            chart.setTitle(new TextTitle(chart.getTitle().getText(), titleFont));
            // 底部
            chart.getLegend().setItemFont(kfont);
            // 得到坐标设置字体解决乱码
            CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
            categoryplot.setDomainGridlinesVisible(true);
            categoryplot.setRangeCrosshairVisible(true);
            categoryplot.setRangeCrosshairPaint(Color.blue);
            NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();
            numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
            BarRenderer barrenderer = (BarRenderer) categoryplot.getRenderer();
            //barrenderer.setBaseItemLabelFont(new Font("宋体", Font.PLAIN, 12));
            barrenderer.setDefaultItemLabelFont(new Font("宋体", Font.PLAIN, 12));
            barrenderer.setSeriesItemLabelFont(1, new Font("宋体", Font.PLAIN, 12));
            CategoryAxis domainAxis = categoryplot.getDomainAxis();
            /*------设置X轴坐标上的文字-----------*/
            domainAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 11));
            /*------设置X轴的标题文字------------*/
            domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));
            /*------设置Y轴坐标上的文字-----------*/
            numberaxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 12));
            /*------设置Y轴的标题文字------------*/
            numberaxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));
            /*------这句代码解决了底部汉字乱码的问题-----------*/
            chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));
            // 生成图片并输出
            FileOutputStream fileOutputStream=new FileOutputStream(outPicture);
            ChartUtils.writeChartAsJPEG(fileOutputStream, 1.0f,chart, 500, 300, null);
            fileOutputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 饼状图
     * @param outPicture
     * @param dataType
     * @param title
     */
    public static void pieChart(File outPicture,DefaultPieDataset dataType,String title){

        try {
            DefaultPieDataset data = dataType;
            // 生成普通饼状图除掉 3D 即可
            // 生产3D饼状图
            PiePlot3D plot = new PiePlot3D(data);
            JFreeChart chart = new JFreeChart(
                title,                          // 图形标题
                JFreeChart.DEFAULT_TITLE_FONT,  // 标题字体
                plot,                           // 图标标题对象
                true                            // 是否显示图例
            );
            // 设置整个图片的背景色
//            chart.setBackgroundPaint(Color.PINK);
            // 设置图片有边框
            chart.setBorderVisible(true);
            // 配置字体
            Font kfont = new Font("宋体", Font.PLAIN, 12);    // 底部
            Font titleFont = new Font("宋体", Font.BOLD, 25); // 图片标题
            // 图片标题
            chart.setTitle(new TextTitle(chart.getTitle().getText(), titleFont));
            // 底部
            chart.getLegend().setItemFont(kfont);
            FileOutputStream fileOutputStream=new FileOutputStream(outPicture);
            ChartUtils.writeChartAsJPEG(fileOutputStream, 1.0f,chart, 500, 300, null);
            fileOutputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 柱状图
     * @param outPicture
     * @param chartTime
     * @param title
     * @param xFieldTitle
     * @param yFieldTitle
     */
    public static void SeriesChart(File outPicture,TimeSeriesCollection chartTime,String title,String xFieldTitle,String yFieldTitle ){

        XYDataset date = chartTime;
        try {
            // 使用ChartFactory来创建时间序列的图表对象
            JFreeChart chart = ChartFactory.createTimeSeriesChart(
                title, // 图形标题
                xFieldTitle, // X轴说明
                yFieldTitle, // Y轴说明
                date, // 数据
                true, // 是否创建图例
                true, // 是否生成Tooltips
                false // 是否生产URL链接
            );
            // 设置整个图片的背景色
            // chart.setBackgroundPaint(Color.PINK);
            // 设置图片有边框
            chart.setBorderVisible(true);
            // 获得图表区域对象
            XYPlot xyPlot = (XYPlot) chart.getPlot();
            // 设置报表区域的背景色
            //xyPlot.setBackgroundPaint(Color.lightGray);
            // 设置横 纵坐标网格颜色
            //xyPlot.setDomainGridlinePaint(Color.GREEN);
            //xyPlot.setRangeGridlinePaint(Color.GREEN);
            // 设置横、纵坐标交叉线是否显示
            xyPlot.setDomainCrosshairVisible(true);
            xyPlot.setRangeCrosshairVisible(true);
            // 获得数据点（X,Y）的render，负责描绘数据点
            XYItemRenderer xyItemRenderer = xyPlot.getRenderer();
            if (xyItemRenderer instanceof XYLineAndShapeRenderer) {
                XYLineAndShapeRenderer xyLineAndShapeRenderer = (XYLineAndShapeRenderer) xyItemRenderer;
                //xyLineAndShapeRenderer.setShapesVisible(true); // 数据点可见
                xyLineAndShapeRenderer.setDefaultShapesVisible(true); // 数据点可见
                //xyLineAndShapeRenderer.setShapesFilled(true);   // 数据点是实心点
                xyLineAndShapeRenderer.setDefaultShapesFilled(true);   // 数据点是实心点
                //xyLineAndShapeRenderer.setSeriesFillPaint(0, Color.RED); // 数据点填充为蓝色
                xyLineAndShapeRenderer.setUseFillPaint(true);// 将设置好的属性应用到render上
            }
            // 配置以下内容方可解决乱码问题
            // 配置字体
            Font xfont = new Font("宋体", Font.PLAIN, 12);    // X轴
            Font yfont = new Font("宋体", Font.PLAIN, 12);    // Y轴
            Font kfont = new Font("宋体", Font.PLAIN, 12);    // 底部
            Font titleFont = new Font("宋体", Font.BOLD, 25); // 图片标题
            // 图片标题
            chart.setTitle(new TextTitle(chart.getTitle().getText(), titleFont));
            // 底部
            chart.getLegend().setItemFont(kfont);
            // X 轴
            ValueAxis domainAxis = xyPlot.getDomainAxis();
            domainAxis.setLabelFont(xfont);// 轴标题
            domainAxis.setTickLabelFont(xfont);// 轴数值
            // domainAxis.setTickLabelPaint(Color.BLUE); // 字体颜色
            // Y 轴
            ValueAxis rangeAxis = xyPlot.getRangeAxis();
            rangeAxis.setLabelFont(yfont);
            // rangeAxis.setLabelPaint(Color.BLUE); // 字体颜色
            rangeAxis.setTickLabelFont(yfont);
            // 定义坐标轴上日期显示的格式
            DateAxis dateAxis = (DateAxis) xyPlot.getDomainAxis();
            // 设置日期格式
            dateAxis.setDateFormatOverride(new SimpleDateFormat("yyyy-MM-dd"));
            // 向客户端输出生成的图片
            FileOutputStream fileOutputStream=new FileOutputStream(outPicture);
            ChartUtils.writeChartAsJPEG(fileOutputStream, 1.0f,chart, 500, 300, null);
            fileOutputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 多值状态图
     * @param outPicture
     * @param dataTime
     * @param title
     * @param xFieldTitle
     * @param yFieldTitle
     */
    public static void SeriesMuliChart(File outPicture,DefaultCategoryDataset dataTime,String title,String xFieldTitle,String yFieldTitle ){

        try {
            DefaultCategoryDataset data = dataTime;
            // 使用ChartFactory创建3D柱状图，不想使用3D，直接使用createBarChart
            JFreeChart chart = ChartFactory.createBarChart(
                title,
                xFieldTitle,
                yFieldTitle,
                data,
                PlotOrientation.VERTICAL,
                true,
                false,
                false
            );
            // 设置整个图片的背景色
            // chart.setBackgroundPaint(Color.PINK);
            // 设置图片有边框
            chart.setBorderVisible(true);
            Font kfont = new Font("宋体", Font.PLAIN, 12);    // 底部
            Font titleFont = new Font("宋体", Font.BOLD, 25); // 图片标题
            // 图片标题
            chart.setTitle(new TextTitle(chart.getTitle().getText(), titleFont));
            // 底部
            chart.getLegend().setItemFont(kfont);
            // 得到坐标设置字体解决乱码
            CategoryPlot categoryplot = (CategoryPlot) chart.getPlot();
            categoryplot.setDomainGridlinesVisible(true);
            categoryplot.setRangeCrosshairVisible(true);
            //categoryplot.setRangeCrosshairPaint(Color.blue);
            NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();
            numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
            BarRenderer barrenderer = (BarRenderer) categoryplot.getRenderer();
            //barrenderer.setBaseItemLabelFont(new Font("宋体", Font.PLAIN, 12));
            barrenderer.setDefaultItemLabelFont(new Font("宋体", Font.PLAIN, 12));
            barrenderer.setSeriesItemLabelFont(1, new Font("宋体", Font.PLAIN, 12));
            CategoryAxis domainAxis = categoryplot.getDomainAxis();
            /*------设置X轴坐标上的文字-----------*/
            domainAxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 11));
            /*------设置X轴的标题文字------------*/
            domainAxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));
            /*------设置Y轴坐标上的文字-----------*/
            numberaxis.setTickLabelFont(new Font("sans-serif", Font.PLAIN, 12));
            /*------设置Y轴的标题文字------------*/
            numberaxis.setLabelFont(new Font("宋体", Font.PLAIN, 12));
            /*------这句代码解决了底部汉字乱码的问题-----------*/
            chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));
            FileOutputStream fileOutputStream=new FileOutputStream(outPicture);
            ChartUtils.writeChartAsJPEG(fileOutputStream, 1.0f, chart, 500, 300, null);

        } catch (Exception es) {
            es.printStackTrace();
        }
    }



}



